/**
 * 全局事件管理器
 */

class EventManager {
    constructor() {
        this.listeners = new Map();
    }

    // 注册事件监听器
    on(eventType, listener) {
        if (!this.listeners.has(eventType)) {
            this.listeners.set(eventType, new Set());
        }
        this.listeners.get(eventType).add(listener);
        
        // 返回取消订阅函数
        return () => this.off(eventType, listener);
    }

    // 取消事件监听器
    off(eventType, listener) {
        if (this.listeners.has(eventType)) {
            this.listeners.get(eventType).delete(listener);
            
            // 如果没有监听器了，删除这个事件类型
            if (this.listeners.get(eventType).size === 0) {
                this.listeners.delete(eventType);
            }
        }
    }

    // 触发事件
    emit(eventType, ...args) {
        if (this.listeners.has(eventType)) {
            this.listeners.get(eventType).forEach(listener => {
                try {
                    listener(...args);
                } catch (error) {
                    console.error(`事件监听器执行错误 [${eventType}]:`, error);
                }
            });
        }
    }

}

// 创建全局实例
const globalEventManager = new EventManager();

// 定义事件类型常量
export const PYTHON_EVENTS = {
    // Python 输出事件
    OUTPUT: 'python:output',
    
    // Python 错误事件
    ERROR: 'python:error',
    
    // Python 状态变化事件
    STATUS_CHANGE: 'python:status',
    
    // Python 输入请求事件
    INPUT_REQUEST: 'python:input-request',
    
    // Python 输入响应事件（用户输入后触发）
    INPUT_RESPONSE: 'python:input-response',
    
    // Python 代码开始运行
    RUN_START: 'python:run-start',
    
    // Python 代码运行结束
    RUN_END: 'python:run-end'
};

// 定义终端事件类型常量
export const TERMINAL_EVENTS = {
    // 显示输入框
    SHOW_INPUT: 'terminal:show-input',
    
    // 隐藏输入框
    HIDE_INPUT: 'terminal:hide-input',
    
    // 聚焦输入框
    FOCUS_INPUT: 'terminal:focus-input',
    
    // 输入框内容变化
    INPUT_CHANGE: 'terminal:input-change'
};

// 定义项目事件类型常量
export const PROJECT_EVENTS = {
    // 项目初始化完成
    INITIALIZED: 'project:initialized',
    
    // 项目状态变化
    STATUS_CHANGE: 'project:status-change'
};

// 定义文件操作事件类型常量
export const FILE_EVENTS = {
    // 文件创建
    CREATED: 'file:created',
    
    // 文件删除
    DELETED: 'file:deleted',
    
    // 文件重命名
    RENAMED: 'file:renamed',
    
    // 文件夹创建
    FOLDER_CREATED: 'file:folder-created',
    
    // 文件内容变化
    CONTENT_CHANGED: 'file:content-changed',
    
    // 文件选中
    SELECTED: 'file:selected',
    
    // 文件打开
    OPENED: 'file:opened',
    
    // 文件关闭
    CLOSED: 'file:closed'
};

export default globalEventManager;
